使用HttpMessageConverter实现HTTP的序列化和反序列化 |
您所在的位置:网站首页 › 序列化 反序列化 java › 使用HttpMessageConverter实现HTTP的序列化和反序列化 |
对象的序列化/反序列化大家应该都比较熟悉:序列化就是将object转化为可以传输的二进制,反序列化就是将二进制转化为程序内部的对象。序列化/反序列化主要体现在程序I/O这个过程中,包括网络I/O和磁盘I/O。 那么什么是http序列化和反序列化呢? 在使用springmvc/SpringBoot时,我们经常会这样写: @RequestMapping("/test") @ResponseBodypublic String test(@RequestBody String param) { return "param '" + param + "'"; }@RestController中有@ResponseBody,可以帮我们把User序列化到resp.body中。@RequestBody可以帮我们把req.body的内容转化为User对象。如果是开发Web应用,一般这两个注解对应的就是Json序列化和反序列化的操作。这里实际上已经体现了Http序列化/反序列化这个过程,只不过和普通的对象序列化有些不一样,Http序列化/反序列化的层次更高,属于一种Object2Object之间的转换。 有过Netty使用经验的对这个应该比较了解,Netty中的Decoder和Encoder就有两种基本层次,层次低的一种是Byte Message,二进制与程序内部消息对象之间的转换,就是常见的序列化/反序列化;另外一种是 Message Message,程序内部对象之间的转换,比较高层次的序列化/反序列化。 Http协议的处理过程,TCP字节流 HttpRequest/HttpResponse 内部对象,就涉及这两种序列化。在springmvc中第一步已经由Servlet容器(tomcat等等)帮我们处理了,第二步则主要由框架帮我们处理。上面所说的Http序列化/反序列化就是指的这第二个步骤,它是controller层框架的核心功能之一,有了这个功能,就能大大减少代码量,让controller的逻辑更简洁清晰,就像上面示意的代码那样,方法中只有一行代码。spirngmvc进行第二步操作,也就是Http序列化和反序列化的核心是HttpMessageConverter。 HttpMessageConverter Http请求响应报文其实都是字符串,当请求报文到java程序会被封装为一个ServletInputStream流,开发人员再读取报文,响应报文则通过ServletOutputStream流,来输出响应报文。 从流中只能读取到原始的字符串报文,同样输出流也是。那么在报文到达SpringMVC / SpringBoot和从SpringMVC / SpringBoot出去,都存在一个字符串到java对象的转化问题。这一过程,在SpringMVC / SpringBoot中,是通过HttpMessageConverter来解决的。HttpMessageConverter接口源码: 同理当执行test方法后,由于返回值标识了@ResponseBody,SpringMVC / SpringBoot将使用StringHttpMessageConverter的write()方法,将结果作为String值写入响应报文,当然,此时canWrite()方法返回true。 借用下图简单描述整个过程: 替换@ResponseBody默认的HttpMessageConverter 1、springboot框架默认的使用jackson进行json转化 public class User { private String username; private Integer age; private Integer phone; private String email; public User(String username, Integer age) { super(); this.username = username; this.age = age; } } @Controller @RequestMapping("/user") public class UserController { @RequestMapping("/testt") @ResponseBody public User testt() { User user = new User("name", 18); return user; } }浏览器访问/user/testt请求结果如下: 2、使用fastjson替代默认的jackson转化方式 增加Fastjson的maven依赖 com.alibaba fastjson 1.2.47Springboot配置FastJsonHttpMessageConverter有两种方法: 方法一:启动类继承extends WebMvcConfigurerAdapter,然后覆盖方法configureMessageConverters import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import org.apache.log4j.Logger; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.web.HttpMessageConverters; import org.springframework.context.annotation.Bean; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.util.ArrayList; import java.util.List; /** springboot以fastjon方式转化json数据 */ @SpringBootApplication public class Application extends WebMvcConfigurerAdapter { private static Logger logger = Logger.getLogger(Application.class); @Override public void configureMessageConverters(List |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |